クラスメソッドメンバーズ提供のCURを日付指定で見るコツ
はじめに
弊社サービスのクラスメソッドメンバーズでは、AWSが提供しているCost and Usage Report(CUR)とは別に、加入されているお客様向けへAWSで利用されたサービスの利用量とコストについての時間単位での明細が記載されたCURをCSVとして独自提供しています。これはメンバーズポータル上でのご利用料金表示に沿ったものとなっています。
社内においても動作確認用に出力していますが、後からX日に出力されたレポートを見たいとなった時に案外手が止まったりします。各日出力の区切りがランダムな文字列となっているためです。
% aws s3 ls s3://cm-cur-XXXXXXXXXXXX/CUR/Hourly/cur_hourly/20201001-20201101/ PRE XXXXXXXX-YYYY-DDDD-MMMM-AAAAAAAAAAAA/ PRE 12345678-1234-1234-1234-123456789012/ PRE 87654321-4321-4321-4321-210987654321/ 2020-10-21 07:25:46 25264 cur_hourly-Manifest.json
シェル芸になりますが、とりあえず迷わなくてすむ手段を整えてみました。
最新の出力を見る
cur_hourly-Manifest.json
を見てみましょう。この中に含まれるassemblyId
に指定されるランダム文字列が最新のパスとなります。
% aws s3 cp s3://cm-cur-XXXXXXXXXXXX/CUR/Hourly/cur_hourly/20201001-20201101/cur_hourly-Manifest.json - | grep assemblyId "assemblyId" : "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX",
当月の出力を日付順に見る
CURの出力バケットに対してaws s3 ls
を実行すると以下のような感じになるかと思われます。
% aws s3 ls s3://cm-cur-XXXXXXXXXXXX/CUR/Hourly/cur_hourly/20201001-20201101/ PRE XXXXXXXX-YYYY-DDDD-MMMM-AAAAAAAAAAAA/ PRE 12345678-1234-1234-1234-123456789012/ PRE 87654321-4321-4321-4321-210987654321/ 2020-10-21 07:25:46 25264 cur_hourly-Manifest.json
このオプション機能を担当している私自身、これだけ見ても何時の日付のものかはわかりません。もしこれをみてひと目で「これはXX日のやつだ」と判断がつく方は暗記してしまうくらいにバケット内を見ている可能性があります。
あまり労しない、現実的な方法を検討してみましょう。Prefixのパスには日付が出ませんが、recursive
オプションを用いることでオブジェクトまでのパスを取り、そこから日付を取る事ができます。
% aws s3 ls s3://cm-cur-XXXXXXXXXXXX/CUR/Hourly/cur_hourly/20201001-20201101/ \ --recursive 2020-10-04 06:07:10 717126 CUR/Hourly/cur_hourly/20201001-20201101/XXXXXXXX-YYYY-DDDD-MMMM-AAAAAAAAAAAA/cur_hourly-1.csv.gz 2020-10-04 06:07:10 25006 CUR/Hourly/cur_hourly/20201001-20201101/XXXXXXXX-YYYY-DDDD-MMMM-AAAAAAAAAAAA/cur_hourly-Manifest.json 2020-10-04 18:10:16 826259 CUR/Hourly/cur_hourly/20201001-20201101/12345678-1234-1234-1234-123456789012/cur_hourly-1.csv.gz 2020-10-04 18:10:17 25006 CUR/Hourly/cur_hourly/20201001-20201101/12345678-1234-1234-1234-123456789012/cur_hourly-Manifest.json 2020-10-07 06:12:29 1713116 CUR/Hourly/cur_hourly/20201001-20201101/87654321-4321-4321-4321-210987654321/cur_hourly-1.csv.gz 2020-10-07 06:12:29 25006 CUR/Hourly/cur_hourly/20201001-20201101/87654321-4321-4321-4321-210987654321/cur_hourly-Manifest.json …
出力されたパスには問題のPrefixが含まれており、且つ一番左側にはオブジェクトの更新日付がでています。ポイントは、時分秒はさておきとしてPrefixが同じ場合は更新日付もまた同じところです。これを利用してみます。
% aws s3 ls s3://cm-cur-XXXXXXXXXXXX/CUR/Hourly/cur_hourly/20201001-20201101/ \ --recursive | sed 's|CUR/Hourly/cur_hourly/20201001-20201101/||' | sed 's|/cur_hourly.*||' 2020-10-04 06:07:10 717126 XXXXXXXX-YYYY-DDDD-MMMM-AAAAAAAAAAAA 2020-10-04 06:07:10 25006 XXXXXXXX-YYYY-DDDD-MMMM-AAAAAAAAAAAA 2020-10-04 18:10:16 826259 12345678-1234-1234-1234-123456789012 2020-10-04 18:10:17 25006 12345678-1234-1234-1234-123456789012 2020-10-07 06:12:29 1713116 87654321-4321-4321-4321-210987654321 2020-10-07 06:12:29 25006 87654321-4321-4321-4321-210987654321
不要なprefixとオブジェクト名を削りました。時分秒とサイズもいらないので削ります。最新のCURに関する情報が含まれるcur_hourly-Manifest.json
についても、今回は不要なため削ってしまいます。
% aws s3 ls s3://cm-cur-XXXXXXXXXXXX/CUR/Hourly/cur_hourly/20201001-20201101/ \ --recursive | sed 's|CUR/Hourly/cur_hourly/20201001-20201101/||' | sed 's|/cur_hourly.*||' | grep -v cur_hourly-Manifest.json | awk '{print $1, $4}' 2020-10-04 XXXXXXXX-YYYY-DDDD-MMMM-AAAAAAAAAAAA 2020-10-04 XXXXXXXX-YYYY-DDDD-MMMM-AAAAAAAAAAAA 2020-10-04 12345678-1234-1234-1234-123456789012 2020-10-04 12345678-1234-1234-1234-123456789012 2020-10-07 87654321-4321-4321-4321-210987654321 2020-10-07 87654321-4321-4321-4321-210987654321
重複して出力されていますが、これはcur_hourly-1.csv.gz
とcur_hourly-Manifest.json
がそれぞれに出力されているためです。考慮する必要はないため重複を省いてしまいます。
% aws s3 ls s3://cm-cur-XXXXXXXXXXXX/CUR/Hourly/cur_hourly/20201001-20201101/ \ --recursive | sed 's|CUR/Hourly/cur_hourly/20201001-20201101/||' | sed 's|/cur_hourly.*||' | grep -v cur_hourly-Manifest.json | awk '{print $1, $4}' | uniq 2020-10-04 XXXXXXXX-YYYY-DDDD-MMMM-AAAAAAAAAAAA 2020-10-04 12345678-1234-1234-1234-123456789012 2020-10-07 87654321-4321-4321-4321-210987654321
日付順で出したいため、sort
も加えておきます。
% aws s3 ls s3://cm-cur-XXXXXXXXXXXX/CUR/Hourly/cur_hourly/20201001-20201101/ \ --recursive | sed 's|CUR/Hourly/cur_hourly/20201001-20201101/||' | sed 's|/cur_hourly.*||' | grep -v cur_hourly-Manifest.json | awk '{print $1, $4}' | uniq | sort 2020-10-01 XXXXXXXX-YYYY-DDDD-MMMM-ABCDEFGHIJKL 2020-10-01 XXXXXXXX-YYYY-DDDD-MMMM-ABABABABABAB 2020-10-02 XXXXXXXX-DDDD-DDDD-MMMM-AAAAAAAAAAAA 2020-10-02 XXXXXXXX-AAAA-DDDD-MMMM-AAAAAAAAAAAA 2020-10-03 DDDDDDDD-AAAA-DDDD-MMMM-AAAAAAAAAAAA 2020-10-03 AAAAAAAA-AAAA-DDDD-MMMM-AAAAAAAAAAAA 2020-10-04 XXXXXXXX-YYYY-DDDD-MMMM-AAAAAAAAAAAA 2020-10-04 12345678-1234-1234-1234-123456789012
おおむね1日2回程度の出力になっているため、一致する形となりました。必要に応じてS3のフルパスを生成して追加すると便利かもしれません。
あとがき
Prefixは仕組み上日付を確認ができませんが、メンバーズサービスのCURに関しては出力仕様の関係で年月日で絞ることが可能です。
特定日付のCURについて調べたい場合に、該当パスを絞り込むための参考になると幸いです。